home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
rabbit
/
rabbit.bas
next >
Wrap
BASIC Source File
|
1994-06-01
|
17KB
|
403 lines
1000 '12ドットフォントエディタ for TownsOS
1010 'DS-MoonRabbit Version 1.00a
1020 'Copyright (c) 1994 Delmonta all rights reserved.
1030 '
1040 'メモリなどの基本的な初期化
1050 CLEAR ,,,120000,0,0
1060 DEFLNG A-Z 'TOWNSだからすべてlongとして差し支えないだろう
1070 ON ERROR GOTO *ERRTRAP
1080 DIM FONTDATA&(&H1B000/4) '編集するフォントデータ
1090 DIM BUTTON(10,3) 'ボタンアイテムの座標
1100 DEF FNBADJIS(H,L) = (H<&H21 OR H>&H20+47 OR L<&H21 OR L>&H7E)
1110 '↑JISコードの範囲外かどうか調べる
1130 'コンソールを使用してタイトルを表示
1140 COLOR 7,0,,4:CLS:CONSOLE 0,24,2 'コンソール画面の最小限の初期化
1150 ISCONSOLE = 1
1160 PRINT "12ドットフォントエディタ for TownsOS"
1170 PRINT "DS-MoonRabbit Version 1.00a"
1180 PRINT "Copyright (c) 1994 Delmonta all rights reserved."
1190 PRINT
1200 FILENAME$=""
1210 LINE INPUT "編集するファイル名:",FILENAME$
1220 IF FILENAME$="" THEN FILENAME$="\sysinit\system.fnt"
1230 ERRCODE = 0
1240 LOAD@ FILENAME$,FONTDATA&
1250 IF ERRCODE=-1 THEN 1230 ELSE IF ERRCODE THEN 1200
1260 '画面初期化
1270 ISCONSOLE = 0
1280 SCREEN @0:SCREEN 0
1290 VIEW (0,0)-(1023,511) : WINDOW (0,0)-(1023,511)
1300 RESTORE *SCRINI_PALETTETABLE:FOR I=0 TO 15 'パレット初期化
1310 *SCRINI_PALETTETABLE
1320 DATA 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 8, 8
1330 DATA 8, 0, 0, 8, 0, 8, 8, 8, 0, 11,11,11
1340 DATA 4, 4, 4, 4, 4,15, 4,15, 4, 4,15,15
1350 DATA 15, 4, 4, 15, 0,15, 15,15, 4, 15,15,15
1360 READ G,R,B:PALETTE I,[G*17,R*17,B*17]
1370 NEXT I
1380 CONSOLE 0,24,2
1390 COLOR ,%9:CLS
1400 MOUSE 0
1410 MOUSE 4,0,0,639,479
1420 MOUSE 1,320,240,1
1430 '画面描画
1440 'ボタンアイテム
1450 LINE (608,1)-(638,31),PSET,%7,BF
1460 SYMBOL (616,8),"×",1,1,%0 'ボタンアイテム#0 - MoonRabbit終了
1470 BUTTON(0,0) = 608 : BUTTON(0,1) = 1
1480 BUTTON(0,2) = 638 : BUTTON(0,3) = 31
1490 COLOR ,%7
1500 SYMBOL (336,96),"↑",1,1,%0,0,OPAQUE 'ボタンアイテム#1 - 前の部分へ
1510 BUTTON(1,0) = 335 : BUTTON(1,1) = 95
1520 BUTTON(1,2) = 352 : BUTTON(1,3) = 112
1530 LINE (335,95)-(352,112),PSET,%7,B
1540 SYMBOL (336,336),"↓",1,1,%0,0,OPAQUE 'ボタンアイテム#2 - 次の部分へ
1550 BUTTON(2,0) = 335 : BUTTON(2,1) = 335
1560 BUTTON(2,2) = 352 : BUTTON(2,3) = 352
1570 LINE (335,335)-(352,352),PSET,%7,B
1580 SYMBOL (64,32),"保存(S)",1,1,%0,0,OPAQUE 'ボタンアイテム#3 - データの保存
1590 BUTTON(3,0) = 63 : BUTTON(3,1) = 31
1600 BUTTON(3,2) = 120 : BUTTON(3,3) = 48
1610 LINE (63,31)-(120,48),PSET,%7,B
1620 SYMBOL (136,32),"再編集(L)",1,1,%0,0,OPAQUE 'ボタンアイテム#4 - 再編集
1630 BUTTON(4,0) = 135 : BUTTON(4,1) = 31
1640 BUTTON(4,2) = 208 : BUTTON(4,3) = 48
1650 LINE (135,31)-(208,48),PSET,%7,B
1660 SYMBOL (536,336),"文字指定(C)",1,1,%0,0,OPAQUE 'ボタンアイテム#5-文字指定
1670 BUTTON(5,0) = 535 : BUTTON(5,1) = 335
1680 BUTTON(5,2) = 624 : BUTTON(5,3) = 352
1690 LINE (535,335)-(624,352),PSET,%7,B
1700 BUTTON_NUM = 6 'ボタンアイテムは全部で6個
1710 FOR I=0 TO BUTTON_NUM-1 'ボタンアイテムの枠を表示
1720 STARTX = BUTTON(I,0)
1730 STARTY = BUTTON(I,1)
1740 ENDX = BUTTON(I,2)
1750 ENDY = BUTTON(I,3)
1760 GOSUB *PULLBUTTON
1770 NEXT
1780 '一覧表
1790 LINE (64,96)-(320,352),PSET,%0,BF
1800 LINE (64,96)-(320,352),PSET,%1,B
1810 SYMBOL (68,80),"0 1 2 3 4 5 6 7 8 9 A B C D E F",1,1,%1
1820 PAGENUM = 0 : GOSUB *PUTPAGE
1830 '方眼
1840 LINE (384-1,112-1)-STEP(12*16+1,12*16+1),PSET,%0,B
1850 EDITCHAR = &H41 : GOSUB *PUTCHAR_LARGE
1860 'メインルーチン
1870 *MAIN
1880 WHILE MOUSE(2,0)=-1 : WEND '既に左ボタンが押されていたら離されるまで待つ
1890 A$="" : WHILE MOUSE(2,0)=0 AND A$="" : A$=INKEY$ : WEND
1900 IF A$="" THEN *MAIN_ENDKB
1910 ON INSTR(" SsLlCc",A$)\2 GOSUB *DISKSAVE,*DISKLOAD,*SETCODE
1920 WHILE INKEY$<>"" : WEND
1930 GOTO *MAIN
1940 *MAIN_ENDKB
1950 X = MOUSE(0)
1960 Y = MOUSE(1)
1970 FOR I=0 TO BUTTON_NUM-1
1980 IF BUTTON(I,0)<=X AND X<=BUTTON(I,2) AND BUTTON(I,1)<=Y AND Y<=BUTTON(I,3) THEN
1990 STARTX = BUTTON(I,0)
2000 STARTY = BUTTON(I,1)
2010 ENDX = BUTTON(I,2)
2020 ENDY = BUTTON(I,3)
2030 GOSUB *CHKBUTTON
2040 IF RETFLAG THEN ON I+1 GOSUB *EXIT,*PREVPAGE,*NEXTPAGE,*DISKSAVE,*DISKLOAD,*SETCODE
2050 I = BUTTON_NUM 'forループから抜け出す
2060 ENDIF
2070 NEXT
2080 IF I=BUTTON_NUM+1 THEN *MAIN 'ボタンアイテムが処理された場合はここで終了
2090 '↑NEXT文で常にI++される。ボタンアイテムでなければこのときI=BUTTON_NUM
2100 IF 64<X AND X<320 AND 96<Y AND Y<352 THEN GOSUB *DRAG : GOTO *MAIN
2110 '↑一覧表からのドラッグ ↓エディット画面からのドラッグ
2120 IF 432<X AND X<448 AND 80<Y AND Y<96 THEN GOSUB *DRAG : GOTO *MAIN
2130 IF 384<=X AND X<576 AND 112<=Y AND Y<304 THEN GOSUB *EDIT : GOTO *MAIN
2140 GOTO *MAIN
2150 'ドットパターンの編集
2160 *EDIT
2170 X = (X-384)\16 : Y = (Y-112)\16
2180 IF EDITCHAR<&H100 AND X>=6 THEN RETURN '半角は横6ドット
2190 LINE (384+X*16,112+Y*16)-STEP(15,15),XOR,%(15 XOR 1),BF
2200 PSET (434+X,82+Y),%(15 XOR 1),XOR
2210 RETURN
2220 'ドラッグ&ドロップ
2230 *DRAG
2240 DIM DRAG_DOTPATN&(127),DRAG_ANDPATN&(31)
2250 '文字パターンを作業領域に移す
2260 IF X<320 THEN '一覧表からのドラッグ
2270 X = (X-64)\16
2280 Y = (Y-96)\16
2290 CHAR = Y*16 + X + PAGENUM*256
2300 IF PAGENUM>0 AND Y>=8 THEN CHAR = CHAR+128
2310 X = X*16 + 64 + 2
2320 Y = Y*16 + 96 + 2
2330 ELSE '方眼の上の原寸表示部からのドラッグ
2340 X = 434
2350 Y = 82
2360 CHAR = -1
2370 ENDIF
2380 GET@A (X,Y)-(X+11,Y+11),DRAG_DOTPATN&
2390 LINE (640,0)-(671,31),PSET,%0,BF
2400 PUT@A (640,0)-(651,11),DRAG_DOTPATN&
2410 'マウスカーソルのパターンを変更する
2420 GET@A (640,0)-(671,31),DRAG_DOTPATN&
2430 GET@ (640,0)-(671,31),DRAG_ANDPATN&,%0
2440 MOUSE 1,,,0
2450 IF CHAR>=256 OR (CHAR=-1 AND EDITCHAR>=256) THEN X=6 ELSE X=3
2460 MOUSE 6,1,DRAG_ANDPATN&,DRAG_DOTPATN&,X,6
2470 MOUSE 1,,,1
2480 'ボタンが離されるまで待つ
2490 WHILE MOUSE(2,0) : WEND
2500 'マウスカーソルを元に戻す
2510 X = MOUSE(0)
2520 Y = MOUSE(1)
2530 MOUSE 0
2540 MOUSE 4,0,0,639,479
2550 MOUSE 1,X,Y,1
2560 '文字パターンのコピー
2570 IF 384<X AND X<576 AND 112<Y AND Y<304 THEN '方眼へのドラッグ
2580 IF CHAR>=0 THEN EDITCHAR = CHAR : GOSUB *PUTCHAR_LARGE
2590 ELSE IF 64<X AND X<320 AND 96<Y AND Y<352 THEN '一覧表へのドラッグ
2600 CHAR = (X-64)\16 + (Y-96 AND -16)
2610 IF CHAR>=128 AND PAGENUM>0 THEN CHAR = CHAR+128
2620 CHAR = CHAR + PAGENUM*256
2630 IF PAGENUM>0 AND FNBADJIS(CHAR\256,CHAR AND 255) THEN
2640 '一覧表中の空欄にドラッグしようとした
2650 ELSE IF PAGENUM THEN 'ドラッグ先は全角
2660 GET@ (640,0)-(651,11),DRAG_ANDPATN&,%15
2670 A = ((CHAR\256 - &H21)*94 + (CHAR MOD 256 - &H21))*6 + &H300
2680 FOR I=0 TO 5
2690 FONTDATA&(A+I) = DRAG_ANDPATN&(I)
2700 NEXT
2710 ELSE 'ドラッグ先は半角
2720 GET@ (640,0)-(645,11),DRAG_ANDPATN&,%15
2730 FOR I=0 TO 2
2740 FONTDATA&(CHAR*3+I) = DRAG_ANDPATN&(I)
2750 NEXT
2760 ENDIF
2770 STARTX = (X AND -16) + 2
2780 STARTY = (Y AND -16) + 2
2790 GOSUB *PUTCHAR
2800 ENDIF
2810 ERASE DRAG_DOTPATN&,DRAG_ANDPATN&
2820 RETURN
2830 '終了
2840 *EXIT
2850 END
2860 '前のページへ
2870 *PREVPAGE
2880 IF PAGENUM=0 THEN RETURN 'すでに半角が表示されていたらそのまま
2890 PAGENUM = PAGENUM-2
2900 IF PAGENUM<&H21 THEN PAGENUM=0
2910 GOSUB *PUTPAGE
2920 RETURN
2930 '次のページへ
2940 *NEXTPAGE
2950 IF PAGENUM=&H21+46 THEN RETURN '46/47区が表示されていたらそのまま
2960 IF PAGENUM=0 THEN PAGENUM = &H21 ELSE PAGENUM = PAGENUM+2
2970 GOSUB *PUTPAGE
2980 RETURN
2990 'ディスクにデータを書き込む
3000 *DISKSAVE
3010 ERRCODE = -2 'KILL文でのエラーは無視
3020 KILL FILENAME$
3030 ERRCODE = 0
3035 SAVE@ FILENAME$,FONTDATA&
3040 IF ERRCODE=-1 THEN GOTO *DISKSAVE
3050 RETURN
3060 'ディスクからデータを読み込む
3070 *DISKLOAD
3080 ERRCODE = 0
3090 LOAD@ FILENAME$,FONTDATA&
3100 IF ERRCODE=-1 THEN GOTO *DISKLOAD
3110 IF ERRCODE=0 THEN GOSUB *PUTPAGE
3120 RETURN
3130 '編集する文字の指定
3140 *SETCODE
3150 CONSOLE 19,1,2
3160 COLOR 7,,,4 'コンソールの文字の色はパレットでは指定できない
3170 *SETCODE_REP
3180 LOCATE 0,19
3190 A$="" : LINE INPUT "編集する文字/JISコード:",A$
3200 PRINT
3210 IF A$="" THEN GOTO *SETCODE_END 'リターンキー空打ち - 中止
3220 IF KLEN(A$)>1 AND KLEN(A$,2)=0 THEN CHAR=VAL("&H"+A$) ELSE CHAR=JIS(A$)
3230 IF CHAR>=256 AND FNBADJIS(CHAR\256,CHAR MOD 256) THEN *SETCODE_REP
3240 EDITCHAR = CHAR : GOSUB *PUTCHAR_LARGE
3250 *SETCODE_END
3260 CONSOLE 0,24,2
3270 RETURN
3280 '一覧表を再表示する
3290 '<in> PAGENUM : ページ番号(表示する文字のJISコード上位8ビット)
3300 '<out> なし
3310 '<break> STARTX,STARTY,CHAR,[TMPX,TMPY]
3320 *PUTPAGE
3330 CHAR = PAGENUM*256
3340 FOR STARTY=98 TO 98+15*16 STEP 16
3350 COLOR ,%9
3360 SYMBOL (32,STARTY-2),RIGHT$("000"+HEX$(CHAR),4),1,1,%1,0,OPAQUE
3370 FOR STARTX=66 TO 66+15*16 STEP 16
3380 GOSUB *PUTCHAR
3390 CHAR = CHAR+1
3400 IF PAGENUM>0 AND (CHAR AND 128) THEN CHAR = CHAR+128
3410 NEXT
3420 NEXT
3430 RETURN
3440 '方眼に文字を表示する
3450 '<in> EDITCHAR : 文字のASCIIコード/JIS漢字コード
3460 '<out>
3470 '<break> STARTX,STARTY,CHAR,[TMPX,TMPY]
3480 *PUTCHAR_LARGE
3490 STARTX=434 : STARTY=82 : CHAR=EDITCHAR : GOSUB *PUTCHAR
3500 DIM PUTC_L_BUF&(23) '原寸表示から方眼部へ拡大コピー
3510 GET@A (434,82)-(434+11,82+11),PUTC_L_BUF&
3520 PUT@A (384,112)-(384+11,112+11),PUTC_L_BUF&,PSET,16,16
3530 ERASE PUTC_L_BUF&
3540 FOR STARTY=0 TO 11 '方眼の各ドットの右下を色違いにする
3550 FOR STARTX=0 TO 11
3560 PSET (384+STARTX*16+15,112+STARTY*16+15),%(15 XOR 1),XOR
3570 NEXT
3580 NEXT
3590 COLOR ,%9
3600 SYMBOL (384,80),RIGHT$("000"+HEX$(EDITCHAR),4),1,1,%1,0,OPAQUE
3610 EDITCHAR = CHAR
3620 RETURN
3630 '12ドットの文字を表示する
3640 '<in> STARTX,STARTY : 表示する位置
3650 ' CHAR : 表示する文字のASCIIコード/JIS漢字コード
3660 '<out> -
3670 '<break> TMPX,TMPY
3680 *PUTCHAR
3690 DIM PUTC_BUF&(5)
3700 IF CHAR<&H100 THEN
3710 FOR TMPX=0 TO 2
3720 PUTC_BUF&(TMPX) = FONTDATA&(CHAR*3 + TMPX)
3730 NEXT
3740 COLOR ,%1
3750 PUT@ (STARTX,STARTY)-(STARTX+5,STARTY+11),PUTC_BUF&,OPAQUE,%15
3760 LINE (STARTX+6,STARTY)-(STARTX+11,STARTY+11),PSET,%0,BF
3770 ELSE
3780 TMPX= CHAR\256
3790 TMPY = CHAR MOD 256
3800 IF FNBADJIS(TMPX,TMPY) THEN
3810 LINE (STARTX,STARTY)-(STARTX+11,STARTY+11),PSET,%0,BF
3820 ELSE
3830 TMPY = ((TMPX-&H21)*94 + TMPY-&H21)*6 + 3*256
3840 FOR TMPX=0 TO 5
3850 PUTC_BUF&(TMPX) = FONTDATA&(TMPY+TMPX)
3860 NEXT
3870 COLOR ,%1
3880 PUT@ (STARTX,STARTY)-(STARTX+11,STARTY+11),PUTC_BUF&,OPAQUE,%15
3890 ENDIF
3900 ENDIF
3910 ERASE PUTC_BUF&
3920 RETURN
3930 '画面上のボタンアイテムが左クリックされたときに呼び出すルーチン
3940 '<in> STARTX,STARTY,ENDX,ENDY :ボタンアイテムの位置(常に始点<終点)
3950 '<out> RETFLAG :1ならクリックとする、0ならキャンセル
3960 '<break> TMPX,TMPY
3970 *CHKBUTTON
3980 GOSUB *PUSHBUTTON
3990 WHILE MOUSE(2,0):WEND 'マウスボタンが放されるまで待つ
4000 TMPX=MOUSE(0) : TMPY=MOUSE(1)
4010 IF STARTX<=TMPX AND TMPX<=ENDX AND STARTY<=TMPY AND TMPY<=ENDY THEN RETFLAG=1 ELSE RETFLAG=0
4020 GOSUB *PULLBUTTON
4030 RETURN
4040 '画面上のボタンアイテムをへこませる
4050 '<in> STARTX,STARTY,ENDX,ENDY :ボタンアイテムの位置
4060 '<out> <break> -
4070 *PUSHBUTTON
4080 LINE (STARTX-1,STARTY-1)-(ENDX +1,ENDY+1),PSET,%0,B
4090 LINE (ENDX +1,ENDY +1)-(STARTX-1,ENDY +1),PSET,%15
4100 LINE (ENDX +1,ENDY +1)-(ENDX +1,STARTY-1),PSET,%15
4110 RETURN
4120 'へこませた画面上のボタンアイテムを元に戻す
4130 '<in> <out> <break> *PUSHBUTTONと同じ
4140 *PULLBUTTON
4150 LINE (STARTX-1,STARTY-1)-(ENDX +1,ENDY +1),PSET,%0,B
4160 LINE (STARTX-1,STARTY-1)-(STARTX-1,ENDY +1),PSET,%15
4170 LINE (STARTX-1,STARTY-1)-(ENDX +1,STARTY-1),PSET,%15
4180 RETURN
4190 'エラー処理ルーチン
4195 *ERRTRAP
4200 IF ERRCODE=-2 THEN ERRCODE=0 : RESUME NEXT
4210 RESTORE *ERRMES_TABLE
4220 *ERRTRAP_REP
4230 READ ERRCODE,ERRMES$
4240 IF ERRCODE=-1 THEN GOTO *ERRTRAP_ENDREP
4250 IF ERRCODE=ERR THEN GOSUB *DISKERR : RESUME NEXT
4260 GOTO *ERRTRAP_REP
4270 *ERRTRAP_ENDREP
4280 A$ = "システムエラー(" + STR$(ERR) + ") 強制終了します"
4290 IF ISCONSOLE THEN
4300 PRINT A$
4310 PRINT "何かキーを押してください..."
4320 WHILE INKEY$="" : WEND
4330 ELSE
4340 SYMBOL (0,400),A$,1,1,%1,,PSET
4350 STARTX = 591
4360 STARTY = 415
4370 ENDX = 624
4380 ENDY = 432
4390 COLOR ,%7
4400 SYMBOL (STARTX-1,STARTY-1),"確認",1,1,%0,,OPAQUE
4410 LINE (STARTX,STARTY)-(ENDX,ENDY),PSET,%7,B
4420 GOSUB *PULLBUTTON
4430 *ERRTRAP_MOUSEREP
4440 WHILE MOUSE(2,0) : WEND
4450 WHILE MOUSE(2,0)=0 : WEND
4460 X = MOUSE(0)
4470 Y = MOUSE(1)
4480 IF X<STARTX OR ENDX<X OR Y<STARTY OR ENDY<Y THEN GOTO *ERRTRAP_ENDREP
4490 GOSUB *CHKBUTTON
4500 IF RETFLAG=0 THEN GOTO *ERRTRAP_MOUSEREP
4510 ENDIF
4520 END
4530 *ERRMES_TABLE
4540 DATA 55,"ファイル名の記述に誤りがあります"
4550 DATA 60,"指定の入出力装置は使用できません"
4560 DATA 63,"指定のファイルが見つかりません"
4570 DATA 65,"ディスクのディレクトリ領域に空きがありません"
4580 DATA 67,"ディスクに空き領域がありません"
4590 DATA 72,"指定されたディスク装置が使用可能な状態になっていません"
4600 DATA 73,"指定されたディスクは書き込みが禁止されています"
4610 DATA 75,"デバイスまたはファイルのアクセスが拒否されました"
4620 DATA -1,""
4630 'ディスクエラー対策
4640 '<out> ERRCODE -1:Retry, 0:Ignore, 1-255:Fail
4650 *DISKERR
4660 ERRMES$ = "ディスクエラー(" + STR$(ERR) + ") " + ERRMES$
4670 IF ISCONSOLE THEN
4680 PRINT ERRMES$
4690 *DISKERR_CONS_REP
4700 LINE INPUT "A:中止,R:再試行,I:無視して続行 :",ERRMES$
4710 IF LEN(ERRMES$)<>1 OR INSTR("AaFfRrIi",ERRMES$)=0 THEN GOTO *DISKERR_CONS_REP
4720 IF ERRMES$="R" OR ERRMES$="r" THEN ERRCODE=-1
4730 IF ERRMES$="I" OR ERRMES$="i" THEN ERRCODE=0
4740 ELSE
4750 SYMBOL (0,384),ERRMES$,1,1,%1,0,PSET
4760 STARTY = 415
4770 ENDY = 432
4780 FOR ERR_I=0 TO 2
4790 STARTX = 447 + ERR_I*64
4800 ENDX = STARTX + 49
4810 LINE (STARTX,STARTY)-(ENDX,ENDY),PSET,%7,BF
4820 SYMBOL (STARTX+1,STARTY+1),MID$(" 中止 再試行 無視 ",ERR_I*6+1,6),1,1,%0,,PSET
4830 GOSUB *PULLBUTTON
4840 NEXT
4850 *DISKERR_REP
4860 WHILE MOUSE(2,0) : WEND
4870 WHILE MOUSE(2,0)=0 : WEND
4880 ERR_X = MOUSE(0) - 447
4890 ERR_Y = MOUSE(1)
4900 IF ERR_Y<STARTY OR ENDY<ERR_Y THEN GOTO *DISKERR_REP
4910 IF ERR_X<0 OR 64*3<=ERR_X OR (ERR_X AND 63)>49 THEN GOTO *DISKERR_REP
4920 ERR_X = ERR_X\64
4930 STARTX = 447 + ERR_X*64
4940 ENDX = STARTX + 49
4950 GOSUB *CHKBUTTON
4960 IF RETFLAG=0 THEN GOTO *DISKERR_REP
4970 LINE (0,384)-(639,433),PSET,%9,BF
4980 IF ERR_X=1 THEN ERRCODE=-1 ELSE IF ERR_X=2 THEN ERRCODE=0
4990 ENDIF
5000 RETURN